/* procfs_pidmax.c

   This program demonstrates how to access a file in the /proc file system. It
   can be used to read and modify the /proc/sys/kernel/pid_max file (which is
   available only in Linux 2.6 and later).

   Usage: procfs_pidmax [new-pidmax]

        Displays the current maximum PID, and, if a command line
        argument is supplied, sets the maximum PID to that value.

        Note: privilege is required to change the maximum PID value.

   This program is Linux-specific.
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_LINE 100
int main(int argc, char *argv[]) {
  int fd;
  char line[MAX_LINE];
  ssize_t n;

  fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : O_RDONLY);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  n = read(fd, line, MAX_LINE);
  if (n == -1) {
    perror("read");
    exit(EXIT_FAILURE);
  }

  if (argc > 1) {
    printf("Old value: ");
  }
  printf("%.*s", (int)n, line);

  if (argc > 1) {
    if (lseek(fd, 0, SEEK_SET) == -1) {
      perror("lseek");
      exit(EXIT_FAILURE);
    }

    if (write(fd, argv[1], strlen(argv[1])) != strlen(argv[1])) {
      perror("write() failed");
      exit(EXIT_FAILURE);
    }

    system(
        "echo /proc/sys/kernel/pid_max now contains "
        "`cat /proc/sys/kernel/pid_max`");
  }

  exit(EXIT_SUCCESS);
}